package com.knowledge.plus.other.获取resources下的文件;

import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.ResourceLoader;
import org.springframework.util.ResourceUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.URLDecoder;

/**
 * 获取资源中的静态文件
 *
 * @author TPF
 * @since 2022/11/4
 */
@RequestMapping("res")
@RestController
public class GetResFile {

    @Autowired
    ResourceLoader resourceLoader;

    /**
     * 不通用，在 Linux 环境中无法读取
     * 使用{@link org.springframework.util.ResourceUtils}
     */
    @Test
    public void test01() throws FileNotFoundException {
        String path = ResourceUtils.getFile("classpath:file/demo.txt").getPath();
        System.out.println(path);
    }

    /**
     * 通用，各环境都能读取
     * 使用{@link org.springframework.core.io.ClassPathResource}
     */
    @Test
    public void test02() throws IOException {
        String path = new ClassPathResource("file/demo.txt").getFile().getPath();
        System.out.println(path);
    }

    /**
     * 通用
     * 使用{@link org.springframework.core.io.ResourceLoader}
     */
    @Test
    public void test03() throws IOException {
        String path = resourceLoader.getResource("classpath:file/demo.txt").getFile().getPath();
        System.out.println(path);
    }

    /**
     * 获取资源根目录
     */
    @GetMapping("file/1")
    public void function1() throws IOException {
        // 注意getResource("") 里面是空字符串
        String path = this.getClass().getClassLoader().getResource("").getPath();
        System.out.println("资源根目录：" + path);
    }

    /**
     * 指定具体文件
     * http://localhost:8889/res/file/2?fileName=file/demo.txt
     */
    @GetMapping("file/2")
    public void function2(String fileName) throws IOException {
        String path = this.getClass().getClassLoader().getResource(fileName).getPath();
        String filePath = URLDecoder.decode(path, "UTF-8"); // 如果路径中带有中文会被URLEncoder, 因此这里需要解码
        System.out.println(filePath);
    }

    /**
     * 通过 .getFile() 获取文件
     * http://localhost:8889/res/file/2?fileName=file/demo.txt
     */
    @GetMapping("file/3")
    public void function3(String fileName) throws IOException {
        String path = this.getClass().getClassLoader().getResource(fileName).getFile();
        String filePath = URLDecoder.decode(path, "UTF-8"); // 如果路径中带有中文会被URLEncoder, 因此这里需要解码
        System.out.println(filePath);
    }

}
